package com.zhang;

import com.zhang.config.WebMvcConfig;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.descriptor.web.FilterDef;
import org.apache.tomcat.util.descriptor.web.FilterMap;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.Filter;
import javax.servlet.ServletContext;

/**
 * 主启动类
 */
public class Boot {
    public Boot() {

        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8081);
        tomcat.getConnector();
        //创建web容器上下文
        Context context = tomcat.addContext("", null);

//            //登录过滤器
//            this.registerFilter(context, new LoginFilter(),"/html/userCode/*");
//            //字符集过滤器
//            this.registerFilter(context,new CharFilter(),"/*");

        //应用上下文对象
        WebApplicationContext wac = createApplicationContext(context.getServletContext());
        //创建前端控制器对象
        DispatcherServlet servlet = new DispatcherServlet(wac);

        //注册前端控制器
        Wrapper wrapper = Tomcat.addServlet(context, "", servlet);
        wrapper.setLoadOnStartup(1);
        wrapper.addMapping("/*");


        try {
            tomcat.start();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        new Boot();
    }

    /**
     * 创建springMvc的应用上下文
     *
     * @param servletContext
     * @return
     */
    public static WebApplicationContext createApplicationContext(
            ServletContext servletContext) {
        AnnotationConfigWebApplicationContext ctx
                = new AnnotationConfigWebApplicationContext();
        ctx.register(WebMvcConfig.class);

        ctx.setServletContext(servletContext);
        ctx.refresh();
        ctx.registerShutdownHook();
        return ctx;
    }


    /**
     * 注册过滤器
     *
     * @param context    WEB上下文
     * @param filterObj  过滤器对象
     * @param utlPattern 过滤范围
     */
    private void registerFilter(Context context, Filter filterObj, String utlPattern) {
        FilterDef filterDef = new FilterDef();
        //设置过滤器
        filterDef.setFilter(filterObj);
        //设置过滤器的名称, 获取类的名字作为过滤器的名字
        filterDef.setFilterName(filterObj.getClass().getName());

        FilterMap filterMap = new FilterMap();
        //设置过滤器的名称，必须与filterDef中的名称一致
        filterMap.setFilterName(filterObj.getClass().getName());
        //设置过滤器的过滤范围
        filterMap.addURLPattern(utlPattern);

        //在服务器上下文中注册过滤器
        context.addFilterDef(filterDef);
        context.addFilterMap(filterMap);
    }
}